home *** CD-ROM | disk | FTP | other *** search
/ Game.EXE 2001 January / Game.EXE_01_2001.iso / demos / Blade of Darkness / data1.cab / Program_Executable_Files / Lib / EnmGenRnd.py < prev    next >
Encoding:
Python Source  |  2000-11-16  |  11.8 KB  |  459 lines

  1. import Bladex
  2. import B3DLib
  3. import EnemyTypes
  4. import Actions
  5. import ItemTypes
  6. import math
  7. import Sounds
  8. import darfuncs
  9. import GameStateAux
  10. import ObjStore
  11. import whrandom
  12.  
  13. def EnemyReady(ent_name):
  14.     print "Borrando '"+ent_name + "quad'"
  15.     o = Bladex.GetEntity(ent_name + "quad")    
  16.     if o:
  17.         o.SubscribeToList("Pin")
  18.     char=Bladex.GetEntity("Player1")
  19.     enm=Bladex.GetEntity(ent_name)    
  20.     Bladex.AddScheduledFunc(Bladex.GetTime(),enm.SetOnFloor,())
  21.     enm.InitPos=pos=enm.Position
  22.     v=char.Position[0]-pos[0], 0.0, char.Position[2]-pos[2]
  23.     v=B3DLib.Normalize(v)
  24.     alfa=-(3.14159/2.0)*(v[0]/abs(v[0]))+math.atan(v[2]/v[0])
  25.     enm.Face(alfa)
  26.     enm.Blind=0
  27.     enm.Deaf=0    
  28.     #enm.Position = 0,0,0
  29.     #enm.RemoveFromWorld()
  30.     #Bladex.AddScheduledFunc(Bladex.GetTime() + 2.0,enm.Data.enmgendata.GeneratorReady,(ent_name,))
  31.  
  32. class Point:
  33.     def __init__(self):
  34.         self.Name="Skl"
  35.         self.EnemyType="Skeleton"
  36.         self.WeaponType=""
  37.         self.WeaponBreak=0
  38.         self.ShieldType=""
  39.         self.ShieldBreak=0
  40.         self.Animation=""
  41.         self.Position = [0,0,0]
  42.         self.Level=None
  43.  
  44.  
  45. class EnmGenRnd:
  46.  
  47.     ObjId=0
  48.     Active=0
  49.     Ready=0        
  50.     NEnemies=4
  51.     NextEnemy=0        
  52.     InitGenFunc=""
  53.     GenerateNotifyFunc=""
  54.     FinishGenFunc=""
  55.     InitGenArgs=()
  56.     NPoints = 0
  57.     OnceEnm = 1
  58.     EnmActivates = 0
  59.     FinishGen = 0
  60.     Points = [0]
  61.     Enemies = [0]
  62.     p = 0
  63.     N_EnmGen = 0
  64.     DifTime = 0
  65.     VirGenPos = [0,0,0]
  66.     Last_Point = 0
  67.     NumDeaths  = 0
  68.     Level = 0
  69.     SonidoGen=None
  70.  
  71.     def __init__(self):
  72.         self.ObjId=ObjStore.GetNewId() # Para identificarlo al grabar/guardar
  73.         ObjStore.ObjectsStore[self.ObjId]=self
  74.         self.VirGenPos=[0,0,0]
  75.         self.Points = [0]
  76.         self.Enemies = [0]
  77.  
  78.     def GeneratorReady(self,ent_name):        
  79.         #enm=Bladex.GetEntity(ent_name)
  80.         #enmgen=enm.Data.enmgendata
  81.         #enmgen.Ready=1
  82.         print "Enemigo muero"
  83.         
  84.         self.NumDeaths = self.NumDeaths-1
  85.         
  86.         if self.NumDeaths == 0:
  87.             if self.OnEnd:
  88.                 self.OnEnd()
  89.         else:
  90.             print "Quedan ",self.NumDeaths,"Enemigos"
  91.  
  92.         enm = Bladex.GetEntity(ent_name)
  93.         enm.Data.ImDeadFuncX(ent_name)
  94.         
  95.         self.Enemies[enm.Data.NEnemy] = 0
  96.         self.EnmActivates = self.EnmActivates - 1        
  97.  
  98.         self.GenerateEnemy()
  99.  
  100.         
  101.         if (self.FinishGen and self.EnmActivates == 0):
  102.             if self.FinishGenFunc:
  103.                 apply(self.FinishGenFunc, (self,))
  104.  
  105.     def ActivateEnemy(self,point):        
  106.         enm = self.Enemies[self.NextEnemy]
  107.         if enm:            
  108.             darfuncs.UnhideBadGuy(enm.Name)
  109.             enm.Blind = 1
  110.             enm.Deaf  = 1
  111.             enm.Position = self.Points[point].Position
  112.             enm.Data.NEnemy = self.NextEnemy
  113.         return enm
  114.  
  115.     def GenerateEnemy(self):
  116.         enmgen = self
  117.         char=Bladex.GetEntity("Player1")
  118.         charpos = char.Position
  119.         lpt = self.Last_Point
  120.         point = self.GetBestGenerationPoint(charpos)
  121.         self.Last_Point = lpt
  122.         if not darfuncs.ValidAppear(self.Points[point].Position):
  123.             Bladex.AddScheduledFunc(Bladex.GetTime()+5.0, self.GenerateEnemy,())
  124.             
  125.             return
  126.         
  127.  
  128.         if enmgen.Ready:
  129.             nenemies = enmgen.OnceEnm - enmgen.EnmActivates
  130.  
  131.             if self.DifTime == 0:
  132.                 if nenemies > 1:
  133.                     if enmgen.NextEnemy + nenemies >= enmgen.NEnemies:
  134.                         nenemies = enmgen.NEnemies - enmgen.NextEnemy
  135.                         enmgen.Deactivate()
  136.                         enmgen.FinishGen = 1
  137.                 elif enmgen.NextEnemy + 1 >= enmgen.NEnemies:
  138.                     enmgen.Deactivate()
  139.                     enmgen.FinishGen = 1
  140.             elif nenemies > 1:
  141.                 if enmgen.NextEnemy + nenemies >= enmgen.NEnemies:
  142.                     nenemies = enmgen.NEnemies - enmgen.NextEnemy
  143.                     enmgen.Deactivate()
  144.                     enmgen.FinishGen = 1
  145.  
  146.                 if nenemies > 1:                    
  147.                     Bladex.AddScheduledFunc(Bladex.GetTime() + self.DifTime+whrandom.random(),self.GenerateEnemy,())
  148.                     nenemies = 1
  149.             elif enmgen.NextEnemy + 1 >= enmgen.NEnemies:
  150.                 enmgen.Deactivate()
  151.                 enmgen.FinishGen = 1
  152.  
  153.                 
  154.             enmgen.EnmActivates = enmgen.EnmActivates + nenemies
  155.  
  156.             t = 0
  157.  
  158.             for t in range(nenemies):                
  159.                 point = self.GetBestGenerationPoint(charpos)
  160.                 enm = self.ActivateEnemy(point)
  161.                 pos = enm.Position
  162.  
  163.                 enmgen.NextEnemy=enmgen.NextEnemy+1
  164.                 v=charpos[0]-pos[0], 0.0, charpos[2]-pos[2]                
  165.                 v=B3DLib.Normalize(v)                
  166.                 
  167.                 if v[0] > 0:
  168.                     alfa=-(3.14159/2.0)*(v[0]/abs(v[0]))+math.atan(v[2]/v[0])
  169.                 else:
  170.                     alfa = 3.14 * -v[1]
  171.  
  172.                 enm.Angle=alfa
  173.  
  174.                 if enmgen.Points[point].Animation:
  175.                     enm.SetTmpAnmFlags(1,1,1,0,5,1)
  176.                     enm.LaunchAnimation(enmgen.Points[point].Animation)                    
  177.                     enm.AnmEndedFunc=EnemyReady
  178.                     darfuncs.CreateFalseCube(enm.Position,-1,enm.Name)
  179.                 else:
  180.                     EnemyReady(enm.Name)
  181.                 
  182.                 Actions.TurnToFaceEntityNow(enm.Name,"Player1")                
  183.                 enm.Data.ImDeadFuncX = enm.ImDeadFunc
  184.                 enm.ImDeadFunc=self.GeneratorReady                
  185.  
  186.                 if enmgen.InitGenFunc:                    
  187.                     enmgen.SonidoGen.Position = pos
  188.                     enmgen.SonidoGen.PlaySound(0)
  189.  
  190.                     apply(enmgen.InitGenFunc, (enm,))
  191.  
  192.     def GetBestGenerationPoint(self,charpos):
  193.         point = self.p
  194.  
  195.         if point + 1 >= self.NPoints:
  196.             self.p = 0
  197.         else:
  198.             self.p = self.p + 1            
  199.  
  200.         for i in range(self.NPoints):
  201.             if point <> self.Last_Point:
  202.                 pos = self.Points[point].Position
  203.                 v=charpos[0]-pos[0], 0.0, charpos[2]-pos[2]
  204.  
  205.                 dist = v[0] * v[0] + v[2] * v[2]
  206.  
  207.                 if dist > 3000000:
  208.                     self.Last_Point = point
  209.                     return point
  210.  
  211.             point = point + 1
  212.  
  213.             if point >= self.NPoints:
  214.                 point = 0
  215.  
  216.         self.Last_Point = point
  217.         return point
  218.  
  219.     def AddPoint(self,pos,enemydscr=("Skl", "Skeleton", "", 0, "", 0), animation="", Level=None):
  220.         point = Point()
  221.         
  222.         point.Position = pos
  223.         point.Name=enemydscr[0]
  224.         point.EnemyType=enemydscr[1]
  225.         point.WeaponBreak=enemydscr[3]
  226.         point.WeaponType=enemydscr[2]
  227.         point.ShieldType=enemydscr[4]
  228.         point.ShieldBreak=enemydscr[5]
  229.         point.Animation=animation                
  230.         point.Level=Level
  231.         
  232.         self.Points[self.NPoints:self.NPoints] = [point]
  233.         self.NPoints = self.NPoints + 1
  234.         
  235.         self.NumDeaths  = self.NumDeaths+1
  236.  
  237.     def CreateEnemy(self,i):
  238.         Rage = self.Points[i].EnemyType
  239.         #Name = self.Points[i].Name
  240.         #pos = self.Points[point].Position
  241.         Name = self.Points[0].Name + `self.N_EnmGen`
  242.  
  243.         self.Points[i].Enm = enm=Bladex.CreateEntity(Name, Rage, self.VirGenPos[0],self.VirGenPos[1],self.VirGenPos[2],"Person")        
  244.         if self.Points[i].Level!=None: enm.Level= self.Points[i].Level
  245.         else: enm.Level= self.Level
  246.         enm.Blind=1
  247.         enm.Deaf=1
  248.  
  249.         if self.Points[i].WeaponType:
  250.             weapon=Bladex.CreateEntity("Weapon"+Name, self.Points[i].WeaponType, 0.0, 0.0, 0.0,"Weapon")
  251.             ItemTypes.ItemDefaultFuncs(weapon)
  252.             Actions.TakeObject(Name, weapon.Name)
  253.  
  254.             weapon.RemoveFromWorld()
  255.                 
  256.         if self.Points[i].ShieldType:
  257.             shield=Bladex.CreateEntity("Shield"+Name, self.Points[i].ShieldType, 0.0, 0.0, 0.0,"Weapon")
  258.             ItemTypes.ItemDefaultFuncs(shield)
  259.             Actions.TakeObject(Name, shield.Name)
  260.             shield.RemoveFromWorld()
  261.                 
  262.         
  263.         EnemyTypes.EnemyDefaultFuncs(enm)
  264.                 
  265.         enm.Data.enmgendata=self
  266.         darfuncs.HideBadGuy(enm.Name)
  267.         self.N_EnmGen = self.N_EnmGen + 1
  268.         
  269.         return enm        
  270.  
  271.  
  272.     def Activate(self):
  273.         if self.NextEnemy<=self.NEnemies:
  274.             self.Active=1
  275.             self.Ready=1
  276.             
  277.             j = i = 0
  278.             
  279.             for i in range(self.NEnemies):
  280.                 if (j >= self.NPoints):
  281.                     j = 0
  282.                 
  283.                 en = self.CreateEnemy(j)
  284.                 if self.CallBak:
  285.                     self.CallBak(en)
  286.  
  287.                 self.Enemies[i:i] = [en]
  288.                 j = j + 1
  289.  
  290.     def Deactivate(self):
  291.         self.Active=0
  292.         self.Ready=0
  293.         #Bladex.RemoveTriggerSectorFunc(self.TrSector, "OnEnter")
  294.  
  295.     def persistent_id(self):
  296.         return self.ObjId
  297.  
  298.     def __del__(self):
  299.         del ObjStore.ObjectsStore[self.ObjId]
  300.  
  301.     def __GetNameEnemies__(self):
  302.         Names = []
  303.         for i in range (self.NEnemies):
  304.             if self.Enemies[i]:
  305.                 Names.append(self.Enemies[i].Name)
  306.             else:
  307.                 Names.append(None)
  308.         
  309.         return Names
  310.  
  311.     def __GetPointsGeneration__(self):
  312.         Points = []        
  313.         for i in range(self.NPoints):
  314.             Points.append((self.Points[i].Position,self.Points[i].Animation))
  315.         return Points
  316.  
  317.     def __SetEnemies__(self,enemies):
  318.         self.Enemies = []
  319.         
  320.         for i in range(self.NEnemies):
  321.             if enemies[i] <> None:
  322.                 self.Enemies.append(Bladex.GetEntity(enemies[i]))
  323.             else:
  324.                 self.Enemies.append(0)
  325.  
  326.     def __SetPoints__(self,points):
  327.         self.Points = []
  328.  
  329.         for i in range(self.NPoints):
  330.             p = Point()
  331.             p.Position = points[i][0]
  332.             p.Animation = points[i][1]
  333.             self.Points.append(p)
  334.  
  335.     def __getstate__(self):
  336.         # Tiene que devolver c≤mo poder guardar el estado de la clase
  337.         stick_objId=None
  338.         return (1,
  339.                 self.ObjId,
  340.                 self.Ready,
  341.                 self.OnceEnm,
  342.                 self.EnmActivates,
  343.                 self.DifTime,
  344.                 self.NextEnemy,
  345.                 self.NEnemies,
  346.                 self.FinishGen,
  347.                 self.p,
  348.                 self.Active,
  349.                 self.NPoints,
  350.                 self.Last_Point,
  351.                 self.NumDeaths,                
  352.                 GameStateAux.SaveFunctionAux(self.InitGenFunc),
  353.                 self.InitGenArgs,
  354.                 GameStateAux.SaveFunctionAux(self.GenerateNotifyFunc),
  355.                 GameStateAux.SaveFunctionAux(self.FinishGenFunc),
  356.                 self.__GetNameEnemies__(),
  357.                 self.__GetPointsGeneration__(),
  358.                 GameStateAux.SaveEntityAux(self.SonidoGen),
  359.                 GameStateAux.SaveNewMembers(self)
  360.                 )
  361.  
  362.     def __setstate__(self,parm):
  363.         # Toma como parßmetro lo que devuelve __getstate__() y debe recrear la clase
  364.         if parm[0]==1:
  365.             #self.ObjId=parm[1] En GameStateAux.PersistentObject()
  366. ##            GameStateAux.PersistentObject.__setstate__(self,parm)
  367.             self.ObjId=parm[1]
  368. ##            GameStateAux.LoadedPickledData[self.ObjId]=self
  369.             ObjStore.ObjectsStore[self.ObjId]=self
  370.             self.Ready=parm[2]
  371.             self.OnceEnm=parm[3]
  372.             self.EnmActivates=parm[4]
  373.             self.DifTime=parm[5]
  374.             self.NextEnemy=parm[6]
  375.             self.NEnemies=parm[7]
  376.             self.FinishGen=parm[8]
  377.             self.p=parm[9]
  378.             self.Active=parm[10]
  379.             self.NPoints=parm[11]
  380.             self.Last_Point=parm[12]
  381.             self.NumDeaths=parm[13]            
  382.             GameStateAux.LoadFunctionAux(parm[14],self,"InitGenFunc")
  383.             self.InitGenArgs=parm[15]
  384.             GameStateAux.LoadFunctionAux(parm[16],self,"GenerateNotifyFunc")
  385.             GameStateAux.LoadFunctionAux(parm[17],self,"FinishGenFunc")
  386.             self.__SetEnemies__(parm[18])
  387.             self.__SetPoints__(parm[19])
  388.             self.SonidoGen = GameStateAux.LoadEntityAux(parm[20])
  389.             print "EnmGenRnd.__setstate__ self.SonidoGen",self.SonidoGen
  390.             GameStateAux.LoadNewMembers(self,parm[21])
  391.  
  392.         else:
  393.             print "Warning -> Version mismatch in EnmGenRnd."
  394.             # Valores de creaci≤n por si valen para algo.
  395.             self.Ready=0
  396.             self.OnceEnm=0
  397.             self.EnmActivates=0
  398.             self.DifTime=0
  399.             self.NextEnemy=0
  400.             self.NEnemies=0
  401.             self.FinisGen=0
  402.             self.p=0
  403.             self.Active=0
  404.             self.NPoints=0
  405.             self.Last_Point=0
  406.             self.NumDeaths=0
  407.             self.InitGenArgs=()
  408.             self.InitGenFunc=None
  409.             self.GenerateNotifyFunc=None
  410.             self.FinishGenFunc=None
  411.             self.ObjId=ObjStore.GetNewId()
  412.             ObjStore.ObjectsStore[self.ObjId]=self
  413.  
  414. def CreateEnemiesGenerator(nenemies=4, enmonce=2,SonidoGen = '..\\..\\Sounds\\M-GENERADOR-ENTIERRA3.wav'):
  415.     enmgen=EnmGenRnd()    
  416.     #enmgen.TrSector=trsector    
  417.     enmgen.NEnemies=nenemies
  418.     enmgen.OnceEnm = enmonce
  419.  
  420.     enmgen.SonidoGen = Sounds.CreateEntitySound(SonidoGen, 'GenTierra')
  421.     enmgen.SonidoGen.Volume=0.3
  422.     enmgen.SonidoGen.MinDistance=5000
  423.     enmgen.SonidoGen.MaxDistance=20000
  424.     enmgen.CallBak = None
  425.     enmgen.OnEnd   = None
  426.  
  427.     #enmgen.AddPoint((x,y,z))
  428.     #Bladex.SetTriggerSectorData(trsector, enmgen)
  429.  
  430.     return enmgen
  431.  
  432. def CreateEnemy(pos,Name,Rage,WeaponType,WeaponBreak,ShieldType,ShieldBreak,Level=0):
  433.     enm=Bladex.CreateEntity(Name, Rage, pos[0],pos[1],pos[2],"Person")
  434.     enm.Blind=1
  435.     enm.Deaf=1
  436.     enm.Level=Level
  437.  
  438.     if WeaponType:
  439.         weapon=Bladex.CreateEntity("Weapon"+Name, WeaponType, pos[0], pos[1], pos[2],"Weapon")
  440.         ItemTypes.ItemDefaultFuncs(weapon)        
  441.         Actions.TakeObject(Name, weapon.Name)
  442.  
  443.     if ShieldType:
  444.         shield=Bladex.CreateEntity("Shield"+Name, ShieldType, 0.0, 0.0, 0.0)
  445.         ItemTypes.ItemDefaultFuncs(shield)
  446.         Actions.TakeObject(Name, shield.Name)
  447.     
  448.     EnemyTypes.EnemyDefaultFuncs(enm)
  449.     enm.Data.Position = pos    
  450.     
  451.     #enm.Position = 0,0,0
  452.     darfuncs.HideBadGuy(enm.Name)
  453.  
  454.     return enm
  455.  
  456. def ActivateEnemy(enm):
  457.     enm.Position = enm.Data.Position
  458.     darfuncs.UnhideBadGuy(enm.Name)
  459.